﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace CCL.SocketMessage.Request
{
    /// <summary>
    /// 파일 삭제를 요청하는 Message의 Body를 제공합니다.
    /// </summary>
    public class FileDelete : Body
    {
        /// <summary>
        /// Project 고유 ID를 가져옵니다.
        /// </summary>
        public int ProjectID { get; private set; }

        /// <summary>
        /// Commit하고자하는 Revision을 가져옵니다.
        /// </summary>
        public int Revision { get; private set; }

        /// <summary>
        /// 상대경로의 글자길이를 가져옵니다.
        /// </summary>
        public int RelativePathLength { get; private set; }
        
        /// <summary>
        /// 프로젝트의 루트로부터의 상대경로를 가져옵니다. (파일이름포함)
        /// </summary>
        public string RelativePath { get; private set; }

        /// <summary>
        /// 새로운 FileDelete 객체를 생성합니다.
        /// </summary>
        /// <param name="projId">Project 고유 ID</param>
        /// <param name="revision">Commit Revision</param>
        /// <param name="relativePath">프로젝트 루트로부터 상대경로</param>
        public FileDelete(int projId, int revision, string relativePath)
        {
            ProjectID = projId;
            Revision = revision;
            RelativePath = relativePath;
            RelativePathLength = relativePath.Length;
        }

        /// <summary>
        /// 직렬화된 byte 배열을 통해 FileDelete 객체를 생성합니다.
        /// </summary>
        /// <param name="bytes">직렬화된 byte 배열</param></param>
        public FileDelete(byte[] bytes)
        {
            int start = 0;

            ProjectID = BitConverter.ToInt32(bytes, start);
            start += sizeof(Int32);

            Revision = BitConverter.ToInt32(bytes, start);
            start += sizeof(Int32);

            RelativePathLength = BitConverter.ToInt32(bytes, start);
            start += sizeof(Int32);

            RelativePath = Encoding.Default.GetString(bytes, start, RelativePathLength);
        }

        /// <summary>
        /// 바이트 배열로 직렬화 합니다.
        /// </summary>
        /// <returns>직렬화된 바이트 배열</returns>
        public override byte[] GetByte()
        {
            byte[] bytes = new byte[GetSize()];

            byte[] temp;
            int start = 0;

            temp = BitConverter.GetBytes(ProjectID);
            Array.Copy(temp, 0, bytes, start, temp.Length);
            start += temp.Length;

            temp = BitConverter.GetBytes(Revision);
            Array.Copy(temp, 0, bytes, start, temp.Length);
            start += temp.Length;

            temp = BitConverter.GetBytes(RelativePathLength);
            Array.Copy(temp, 0, bytes, start, temp.Length);
            start += temp.Length;

            temp = Utility.StringUtility.StringToBytes(RelativePath, RelativePathLength);
            Array.Copy(temp, 0, bytes, start, temp.Length);
            start += temp.Length;

            return bytes;
        }

        /// <summary>
        /// 직렬화 가능한 객체의 바이트 사이즈를 가져옵니다.
        /// </summary>
        /// <returns>직렬화된 바이트 사이즈</returns>
        public override uint GetSize()
        {
            uint size = 0;

            size += sizeof(int);
            size += sizeof(int);
            size += sizeof(int);
            size += (uint)RelativePath.Length;

            return size;
        }
    }
}
